package com.ruoyi.system.service.impl;

import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.mapper.YdMeterDataMapper;
import com.ruoyi.system.domain.YdMeterData;
import com.ruoyi.system.service.IYdMeterDataService;

/**
 * 易达电表数据Service业务层处理
 * 
 * @author ruoyi
 * @date 2024-01-15
 */
@Service
public class YdMeterDataServiceImpl implements IYdMeterDataService 
{
    private static final Logger log = LoggerFactory.getLogger(YdMeterDataServiceImpl.class);
    
    @Autowired
    private YdMeterDataMapper ydMeterDataMapper;

    /**
     * 查询易达电表数据
     * 
     * @param id 易达电表数据主键
     * @return 易达电表数据
     */
    @Override
    public YdMeterData selectYdMeterDataById(Long id)
    {
        return ydMeterDataMapper.selectYdMeterDataById(id);
    }

    /**
     * 查询易达电表数据列表
     * 
     * @param ydMeterData 易达电表数据
     * @return 易达电表数据
     */
    @Override
    public List<YdMeterData> selectYdMeterDataList(YdMeterData ydMeterData)
    {
        return ydMeterDataMapper.selectYdMeterDataList(ydMeterData);
    }

    /**
     * 新增易达电表数据
     * 
     * @param ydMeterData 易达电表数据
     * @return 结果
     */
    @Override
    public int insertYdMeterData(YdMeterData ydMeterData)
    {
        ydMeterData.setCreateTime(DateUtils.getNowDate());
        return ydMeterDataMapper.insertYdMeterData(ydMeterData);
    }

    /**
     * 修改易达电表数据
     * 
     * @param ydMeterData 易达电表数据
     * @return 结果
     */
    @Override
    public int updateYdMeterData(YdMeterData ydMeterData)
    {
        ydMeterData.setUpdateTime(DateUtils.getNowDate());
        return ydMeterDataMapper.updateYdMeterData(ydMeterData);
    }

    /**
     * 批量删除易达电表数据
     * 
     * @param ids 需要删除的易达电表数据主键
     * @return 结果
     */
    @Override
    public int deleteYdMeterDataByIds(String ids)
    {
        return ydMeterDataMapper.deleteYdMeterDataByIds(Convert.toStrArray(ids));
    }

    /**
     * 删除易达电表数据信息
     * 
     * @param id 易达电表数据主键
     * @return 结果
     */
    @Override
    public int deleteYdMeterDataById(Long id)
    {
        return ydMeterDataMapper.deleteYdMeterDataById(id);
    }
    
    /**
     * 获取指定设备最后一条数据
     * 
     * @param deviceId 设备ID
     * @return 易达电表数据
     */
    @Override
    public YdMeterData getLastDataByDeviceId(String deviceId)
    {
        return ydMeterDataMapper.getLastDataByDeviceId(deviceId);
    }

    /**
     * 按炉号查询数据列表
     * 
     * @param furnaceNo 炉号
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 易达电表数据集合
     */
    @Override
    public List<YdMeterData> selectDataByFurnaceNo(Integer furnaceNo, String startDate, String endDate)
    {
        // 格式化日期范围
        String formattedStartDate = formatStartDate(startDate);
        String formattedEndDate = formatEndDate(endDate);
        return ydMeterDataMapper.selectDataByFurnaceNo(furnaceNo, formattedStartDate, formattedEndDate);
    }

    /**
     * 按时间范围查询数据列表
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 易达电表数据集合
     */
    @Override
    public List<YdMeterData> selectDataByTimeRange(String startDate, String endDate)
    {
        // 格式化日期范围
        String formattedStartDate = formatStartDate(startDate);
        String formattedEndDate = formatEndDate(endDate);
        return ydMeterDataMapper.selectDataByTimeRange(formattedStartDate, formattedEndDate);
    }
    
    /**
     * 按日统计数据
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 统计数据
     */
    @Override
    public List<Map<String, Object>> statisticsByDay(String startDate, String endDate)
    {
        try {
            // 格式化日期范围
            String formattedStartDate = formatStartDate(startDate);
            String formattedEndDate = formatEndDate(endDate);
            List<Map<String, Object>> result = ydMeterDataMapper.statisticsByDay(formattedStartDate, formattedEndDate);
            return result != null ? result : new java.util.ArrayList<>();
        } catch (Exception e) {
            log.error("按日统计数据异常", e);
            return new java.util.ArrayList<>();
        }
    }

    /**
     * 按炉号统计数据
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 统计数据
     */
    @Override
    public List<Map<String, Object>> statisticsByFurnace(String startDate, String endDate)
    {
        try {
            // 格式化日期范围
            String formattedStartDate = formatStartDate(startDate);
            String formattedEndDate = formatEndDate(endDate);
            List<Map<String, Object>> result = ydMeterDataMapper.statisticsByFurnace(formattedStartDate, formattedEndDate);
            return result != null ? result : new java.util.ArrayList<>();
        } catch (Exception e) {
            log.error("按炉号统计数据异常", e);
            return new java.util.ArrayList<>();
        }
    }
    
    /**
     * 格式化开始日期，如果只有日期则添加时间部分00:00:00
     * 支持格式：yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss
     * 
     * @param dateStr 日期字符串
     * @return 格式化后的日期字符串
     */
    private String formatStartDate(String dateStr) {
        if (StringUtils.isEmpty(dateStr)) {
            return dateStr;
        }
        // 如果日期字符串不包含时间部分，添加00:00:00
        if (dateStr.length() == 10 && dateStr.matches("\\d{4}-\\d{2}-\\d{2}")) {
            return dateStr + " 00:00:00";
        }
        return dateStr;
    }

    /**
     * 格式化结束日期，如果只有日期则添加时间部分23:59:59
     * 支持格式：yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss
     * 
     * @param dateStr 日期字符串
     * @return 格式化后的日期字符串
     */
    private String formatEndDate(String dateStr) {
        if (StringUtils.isEmpty(dateStr)) {
            return dateStr;
        }
        // 如果日期字符串不包含时间部分，添加23:59:59
        if (dateStr.length() == 10 && dateStr.matches("\\d{4}-\\d{2}-\\d{2}")) {
            return dateStr + " 23:59:59";
        }
        return dateStr;
    }

    @Override
    public Map<String, Object> getTotalByFurnace(Integer furnaceNo, String type, String date) {
        return ydMeterDataMapper.selectTotalByFurnace(furnaceNo, type, date);
    }
}